(function () {
    "use strict";

    angular.module('core').controller('EtiquetaDetailController', controller);
    controller.$inject = ['$scope', '$timeout', '$state', '$stateParams', '$q', 'etiquetaService','lookupService', '$alert'];

    function controller($scope, $timeout, $state, $stateParams, $q, etiquetaService, lookupService, $alert) {
        $scope.initializeLayout('Etiqueta');

        //[Inicializa objetos]
        $scope.state = {
            item: { ID: decodeURIComponent($stateParams.id) },
            itensFiltro: [],
            carregando: false,
            vazio: false,
            abaFiltroEtiqueta: 'filtros',
            bipagem: {
                codigoBarra: ''
            },
            impressoras: {
                data: [],
                selecionada: {},
                ativo: false,
                toggle: function () {
                    $scope.state.impressoras.ativo = !$scope.state.impressoras.ativo;
                    if ($scope.state.impressoras.ativo) {
                        $scope.getImpressora();
                    }
                },
                enviar: function () {
                    $scope.state.item.Status = 1;
                    $scope.save(true);
                }
            },
            filtro: {
                ativo: false,
                args: {
                    codigoBarra: '',
                    filtro: {
                        Status: 2,
                        Ativo: 1,
                        Grupo: {},
                        Subgrupo: {},
                        Marca: {},
                        Fabricacao: { Fornecedor: { Empresa: {} } },
                        Linha: {},
                        Tipo: {},
                        Colecao: {},
                        Grade: {}
                    },
                    priceTable: {},
                    qtde: 0
                }
            }
        };

        //[Inicializa funcões]
        $scope.initialize = function () {
            $scope.refresh();
        };

        $scope.popups = {
            addProdutos: {
                ativo: false,
                onToggle: function () {
                    $scope.popups.addProdutos.ativo = !$scope.popups.addProdutos.ativo
                    if ($scope.popups.addProdutos.ativo) {
                        $scope.state.abaFiltroEtiqueta = 'filtros';
                        $scope.state.itensFiltro = [];
                        $scope.state.filtro.args = {
                            codigoBarra: '',
                            filtro: {
                                Status: 2,
                                Ativo: 1,
                                Grupo: {},
                                Subgrupo: {},
                                Marca: {},
                                Fabricacao: { Fornecedor: { Empresa: {} } },
                                Linha: {},
                                Tipo: {},
                                Colecao: {},
                                Grade: {}
                            },
                            priceTable: {},
                            qtde: 0
                        }
                    }
                }
            },
        };

        $scope.auxiliar = {
            marca: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllMarca({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            linha: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllLinha({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            tipo: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllTipoProduto({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            colecao: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllColecao({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            grade: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllGrade({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            composicao: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllComposicao({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            grupo: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllGrupo({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            fornecedor: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllFornecedor({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            unidade: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllUnidade({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            varianteBasica: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllVarianteBasica({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            grupoFiscalProduto: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllGrupoFiscalProduto({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            grupoComposicaoImposto: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllGrupoComposicaoImposto({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            ncm: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllNCM({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            origemTributo: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllOrigemTributo({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            situacaoTributaria: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllSituacaoTributaria({ chaves: chaves, filtroEm: [{ Imposto: { Codigo: '1' } }, { Imposto: { Codigo: '44' } }] })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            substituicaoTributaria: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllSubstituicaoTributaria({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            tabelaPreco: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllTabelaPreco({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            look: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllLook({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            produto: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllProduto({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
        };

        $scope.save = function (noredirect) {
            $scope.state.salvando = true;
            etiquetaService
                .save($scope.state.item)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.state.salvando = false;
                        $alert({ text: response.Message, title: $scope.Title });
1                    } else {
                        if (noredirect) {
                            $scope.state.impressoras.toggle();
                            $scope.tools.toastr.success("Etiquetas enviadas para impressão com sucesso!");
                        }
                        else
                            $scope.historyBack();
                    }
                },
                function (_error) {
                    $scope.state.salvando = false;
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                });
        }
        $scope.delete = function () {
            $scope.state.salvando = true;
            etiquetaService
                .delete($scope.state.item.ID)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.state.salvando = false;
                            $alert({ text: response.Message, title: $scope.Title });
                        } else {
                            $scope.historyBack();
                        }
                    },
                    function (_error) {
                        $scope.state.salvando = false;
                        $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    });
        }
        $scope.voltarFiltrosEtiqueta = function () {
            $scope.state.abaFiltroEtiqueta = 'filtros';
        };
        $scope.removerItemFiltro = function (item) {
            var index = $scope.state.itensFiltro.indexOf(item);

            if (index >= 0) {
                $scope.state.itensFiltro.splice(index, 1);
            }
        };
        $scope.removerEtiqueta = function (item) {
            var index = $scope.state.item.Etiquetas.indexOf(item);

            if (index >= 0) {
                $scope.state.item.Etiquetas.splice(index, 1);
            }
        };
        $scope.getAllProdutos = function (nousingModal) {
            $scope.state.carregando = true;
            
            if ($scope.state.filtro.args == null) {

                $scope.state.filtro.args = {
                    filtro: { Status: 2, Ativo: 1 },
                    qtde: 0
                }
            }
            else {
                
                if (!$scope.state.filtro.args.filtro)
                    $scope.state.filtro.args.filtro = {} 
                $scope.state.filtro.args.filtro.Status = 2;
                $scope.state.filtro.args.filtro.Ativo = 1;
                if (!$scope.state.filtro.args.qtde)
                    $scope.state.filtro.args.qtde = 0;
            }


            etiquetaService
                .getProdutos($scope.state.filtro.args)
                .then(
                    function (response) {
                        //   $scope.state.filtro.args.filtro.Codigo = "";
                        if (response.Status < 0) { 
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                            $scope.state.carregando = false;
                        } else {
                            var produtos = response.Data;
                            if (!produtos || produtos.length <= 0) {
                                $scope.state.carregando = false;
                                $scope.tools.toastr.error('Nenhum produto foi encontrado com os filtros informados.');
                                return
                            }
                            $scope.state.itensFiltro = response.Data;
                            $scope.state.abaFiltroEtiqueta = 'resultado';
                            $scope.state.carregando = false;

                        }

                    },
                    function (_error) {
                        $scope.state.filtro.args.filtro.Codigo = "";
                        $scope.state.carregando = false; 
                        $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                        console.error(_error);
                    }
                );
        };

        $scope.adicionarCodigoBarra = function ($event) {
            if ($event) {
                $event.preventDefault();
                $event.stopPropagation();
            }

            if (!$scope.state.bipagem.codigoBarra) {
                $scope.tools.toastr.error('Informe o código de barras.');
                return;
            }

            $scope.state.filtro.args = $scope.state.filtro.args || {};
            $scope.state.filtro.args.filtro = $scope.state.filtro.args.filtro || {};
            $scope.state.filtro.args.filtro.Status = 2;
            $scope.state.filtro.args.filtro.Ativo = 1;
            $scope.state.filtro.args.codigoBarra = $scope.state.bipagem.codigoBarra;
            $scope.state.filtro.args.qtde = $scope.state.filtro.args.qtde || 0;

            $scope.state.carregando = true;
            etiquetaService
                .getProdutos($scope.state.filtro.args)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                            return;
                        }

                        var produtos = response.Data;
                        if (!produtos || produtos.length <= 0) {
                            $scope.tools.toastr.error('Código de barras não encontrado.');
                            return;
                        }

                        $scope.state.item.Etiquetas = $scope.state.item.Etiquetas || [];

                        angular.forEach(produtos, function (produto) {
                            var itemExistente = $scope.state.item.Etiquetas.find(function (etiqueta) {
                                return etiqueta.CodigoBarra === produto.CodigoBarra;
                            });

                            if (itemExistente) {
                                itemExistente.Preco = produto.Preco;
                                itemExistente.Quantidade = produto.Quantidade;
                                itemExistente.Desconto = produto.Desconto;
                            } else {
                                $scope.state.item.Etiquetas.push(angular.copy(produto));
                            }
                        });

                        $scope.state.bipagem.codigoBarra = '';
                        $scope.state.filtro.args.codigoBarra = '';
                    },
                    function (_error) {
                        $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                        console.error(_error);
                    }
                )
                .finally(function () {
                    $scope.state.carregando = false;
                });
        };

        $scope.state.paginacaoEtiquetas = {
            paginaAtual: 1,
            itensPorPagina: 20
        };

        $scope.totalPaginasEtiquetas = function () {
            if (!$scope.state.item || !$scope.state.item.Etiquetas) {
                return 1;
            }

            var total = Math.ceil($scope.state.item.Etiquetas.length / $scope.state.paginacaoEtiquetas.itensPorPagina);

            return total > 0 ? total : 1;
        };

        $scope.proximaPaginaEtiquetas = function () {
            if ($scope.state.paginacaoEtiquetas.paginaAtual < $scope.totalPaginasEtiquetas()) {
                $scope.state.paginacaoEtiquetas.paginaAtual++;
            }
        };

        $scope.paginaAnteriorEtiquetas = function () {
            if ($scope.state.paginacaoEtiquetas.paginaAtual > 1) {
                $scope.state.paginacaoEtiquetas.paginaAtual--;
            }
        };

        $scope.copiarItensFiltroParaEtiquetas = function () {
            
            $scope.state.item.Etiquetas = $scope.state.item.Etiquetas || [];

            angular.forEach($scope.state.itensFiltro.filter(a => a.Quantidade > 0), function (itemFiltro) {
                
                var itemExistente = $scope.state.item.Etiquetas.find(function (etiqueta) {
                    return etiqueta.CodigoBarra === itemFiltro.CodigoBarra;
                });

                if (itemExistente) {
                    itemExistente.Preco = itemFiltro.Preco;
                    itemExistente.Quantidade = itemFiltro.Quantidade;
                    itemExistente.Desconto = itemFiltro.Desconto;
                } else {
                    
                    $scope.state.item.Etiquetas.push(angular.copy(itemFiltro));
                }
            });
            $scope.state.itensFiltro = null

            $scope.popups.addProdutos.onToggle();
        };

        $scope.get = function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            etiquetaService
                .get($scope.state.item)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        } else {
                            $scope.state.item = response.Data;
                        }
                        $scope.state.carregando = false;
                        $scope.state.vazio = !$scope.state.item;
                    },
                    function (_error) {
                        $scope.state.carregando = false;
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                        console.error(_error);
                    }
                );
        };

        $scope.getImpressora = function () { 
            etiquetaService
                .getImpressoras()
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        } else {
                            $scope.state.impressoras.data = response.Data;
                        } 
                    },
                    function (_error) {
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                        console.error(_error);
                    }
                );
        };
        $scope.refresh = function () {
            $scope.get();
        };

        /*Inicializa funções*/
        $scope.initialize();

    }

})();
